home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: Assembly / assembly resource for source.iso / assem01 / guiasm.asm < prev    next >
Assembly Source File  |  1995-11-01  |  9KB  |  470 lines

  1.         COMMENT +
  2.  
  3.         machine language module for the graphical user interface
  4.  
  5.         +
  6.  
  7. _AOFF           EQU     6       ;STACK OFFSET TO FIRST ARG
  8.  
  9. CGA             EQU     1       ;THESE EQUATES ARE EQUIVALENT TO
  10. MCGA            EQU     2       ;THE VALUES RETURNED BY THE
  11. EGA             EQU     3       ;TURBO C DetectGraph FUNCTION
  12. HERCMONO        EQU     7
  13.  
  14. _AOFF           EQU     6       ;FAR STACK OFFSET
  15.  
  16. FONTDEPTH       EQU     8
  17. MENULINEDEPTH   EQU     12
  18.  
  19. ;SET ALL FOUR PLANES ON AN EGA OR VGA DISPLAY
  20. FOURPLANES      MACRO
  21.         LOCAL   FPEXIT
  22.         CMP     DS:[_SCREENSEG],0A000H
  23.         JNE     FPEXIT
  24.         MOV     AL,2
  25.         MOV     DX,03C4H
  26.         OUT     DX,AL
  27.         INC     DX
  28.         MOV     AL,0FH
  29.         OUT     DX,AL
  30. FPEXIT:
  31.         ENDM
  32.  
  33. ;THIS MACRO FETCHES THE DATA SEGMENT
  34. DATASEG         MACRO
  35.         PUSH    AX
  36.         MOV     AX,_DATA
  37.         MOV     DS,AX
  38.         POP     AX
  39.         ENDM
  40.  
  41. ;DISPLAY THE MOUSE CURSOR
  42. MOUSEON         MACRO
  43.         MOV     AX,0001H
  44.         INT     33H
  45.         ENDM
  46.  
  47. ;HIDE THE MOUSE CURSOR
  48. MOUSEOFF        MACRO
  49.         MOV     AX,0002H
  50.         INT     33H
  51.         ENDM
  52.  
  53. ;TRANSLATE PIXELS TO BYTES IN AX
  54. PIXELS2BYTES    MACRO
  55.         ADD     AX,0007H
  56.         SHR     AX,1
  57.         SHR     AX,1
  58.         SHR     AX,1
  59.         ENDM
  60.  
  61. ;TRANSLATE PIXELS TO WORDS IN AX
  62. PIXELS2WORDS    MACRO
  63.         ADD     AX,000FH
  64.         SHR     AX,1
  65.         SHR     AX,1
  66.         SHR     AX,1
  67.         SHR     AX,1
  68.         ENDM
  69.  
  70. APASM_TEXT      SEGMENT BYTE PUBLIC 'CODE'
  71.         ASSUME  CS:APASM_TEXT,DS:_DATA
  72.  
  73. ;DRAW A WHITE RULE ACROSS THE SCREEN
  74. ;               ARG1 = DEPTH
  75. ;               ARG2 = TOPLINE
  76.         PUBLIC  _WhiteRule
  77. _WhiteRule      PROC    FAR
  78.         PUSH    BP
  79.         MOV     BP,SP
  80.  
  81.         DATASEG
  82.         FOURPLANES
  83.         MOUSEOFF
  84.         MOV     AX,DS:[_SCREENSEG]
  85.         MOV     ES,AX
  86.  
  87.         MOV     CX,[BP + _AOFF + 0]
  88.         MOV     BX,[BP + _AOFF + 2]
  89.         SHL     BX,1
  90.         MOV     DX,DS:[_SCREENBYTES]
  91. WR1:            PUSH    CX
  92.         MOV     DI,DS:[_SCREENTBL+BX]
  93.         ADD     BX,2
  94.         MOV     CX,DX
  95.         CLD
  96.         MOV     AL,0FFH
  97.     REPNE   STOSB
  98.         POP     CX
  99.         LOOP    WR1
  100.         MOUSEON
  101.         POP     BP
  102.         RET
  103. _WhiteRule      ENDP
  104.  
  105. ;DRAW A BLACK RULE ACROSS THE SCREEN
  106. ;               ARG1 = DEPTH
  107. ;               ARG2 = TOPLINE
  108.         PUBLIC  _BlackRule
  109. _BlackRule      PROC    FAR
  110.         PUSH    BP
  111.         MOV     BP,SP
  112.  
  113.         DATASEG
  114.         FOURPLANES
  115.         MOUSEOFF
  116.         MOV     AX,DS:[_SCREENSEG]
  117.         MOV     ES,AX
  118.         MOV     CX,[BP + _AOFF + 0]
  119.         MOV     BX,[BP + _AOFF + 2]
  120.         SHL     BX,1
  121.         MOV     DX,DS:[_SCREENBYTES]
  122. BR1:            PUSH    CX
  123.         MOV     DI,DS:[_SCREENTBL+BX]
  124.         ADD     BX,2
  125.         MOV     CX,DX
  126.         CLD
  127.         MOV     AL,00H
  128.     REPNE   STOSB
  129.         POP     CX
  130.         LOOP    BR1
  131.         MOUSEON
  132.         POP     BP
  133.         RET
  134. _BlackRule      ENDP
  135.  
  136. ;DRAW A TEXT STRING
  137. ;               ARG1 = X
  138. ;               ARG2 = Y
  139. ;               ARG3 = STRING
  140. ;               ARG4 = MASK
  141.         PUBLIC _DrawString
  142. _DrawString     PROC    FAR
  143.         PUSH    BP
  144.         MOV     BP,SP
  145.  
  146.         DATASEG
  147.         FOURPLANES
  148.         MOUSEOFF
  149.         MOV     AX,DS:[_SCREENSEG]
  150.         MOV     ES,AX
  151.  
  152.         MOV     CL,3
  153.         SHR     WORD PTR [BP + _AOFF + 0],CL
  154.         MOV     CX,FONTDEPTH
  155. DS1:            PUSH    CX
  156.         DEC     CX
  157.  
  158.         MOV     AX,[BP + _AOFF + 8]
  159.         XCHG    AH,AL
  160.         MOV     [BP + _AOFF + 8],AX
  161.  
  162.         MOV     BX,[BP + _AOFF + 2]
  163.         ADD     BX,CX
  164.         SHL     BX,1
  165.  
  166.         DATASEG
  167.         MOV     DI,DS:[_SCREENTBL+BX]
  168.         ADD     DI,[BP + _AOFF + 0]
  169.  
  170.         MOV     SI,[BP + _AOFF + 4]
  171.         MOV     DS,[BP + _AOFF + 6]
  172.  
  173. DS2:            MOV     BH,00H
  174.         MOV     BL,DS:[SI]
  175.         CMP     BL,0
  176.         JE      DS3
  177.  
  178.         PUSH    DS
  179.         SHL     BX,1
  180.         SHL     BX,1
  181.         SHL     BX,1
  182.  
  183.         ADD     BX,CX
  184.  
  185.         DATASEG
  186.         MOV     AL,DS:[_THEFONT+BX]
  187.         AND     AX,[BP + _AOFF + 8]
  188.         NOT     AL
  189.         STOSB
  190.  
  191.         POP     DS
  192.         INC     SI
  193.         JMP     DS2
  194.  
  195. DS3:            POP     CX
  196.         LOOP    DS1
  197.  
  198. DSX:            DATASEG
  199.         MOUSEON
  200.         POP     BP
  201.         RET
  202. _DrawString     ENDP
  203.  
  204. ;CLEAR THE SCREEN TO GREY
  205.         PUBLIC  _ClearScreen
  206. _ClearScreen    PROC    FAR
  207.  
  208.         MOV     AX,_DATA
  209.         MOV     DS,AX
  210.  
  211.         MOV     AX,_SCREENSEG
  212.         MOV     ES,AX
  213.  
  214.         FOURPLANES
  215.         MOUSEOFF
  216.  
  217.         MOV     CX,_SCREENDEEP
  218.         SUB     CX,MENULINEDEPTH
  219.         MOV     BX,(MENULINEDEPTH*2)
  220.  
  221. CLS1:           PUSH    CX
  222.         TEST    CX,1
  223.         MOV     AL,0AAH
  224.         JZ      CLS2
  225.         MOV     AL,055H
  226. CLS2:           MOV     DI,[_SCREENTBL+BX]
  227.         MOV     CX,_SCREENBYTES
  228.         CLD
  229.     REPNE   STOSB
  230.         POP     CX
  231.         ADD     BX,2
  232.         LOOP    CLS1
  233.  
  234.         MOUSEON
  235.         RET
  236. _ClearScreen    ENDP
  237.  
  238. ;SET UP THE SCREEN TABLE
  239. ;               ARG1 = CARD TYPE
  240.         PUBLIC  _DoTable
  241. _DoTable        PROC    FAR
  242.         PUSH    BP
  243.         MOV     BP,SP
  244.  
  245.         DATASEG
  246.  
  247.         CMP     WORD PTR [BP + _AOFF + 0],CGA
  248.         JNE     NOT_CGA                 ;CHECK CARD TYPE
  249.  
  250.         ;IT'S A CGA CARD
  251.         MOV     _SCREENSEG,0B800H
  252.         MOV     _SCREENBYTES,80
  253.         MOV     _SCREENWIDE,640
  254.         MOV     _SCREENDEEP,200
  255.  
  256.         MOV     CX,_SCREENDEEP
  257.         SUB     DX,DX
  258.         MOV     SI,OFFSET _SCREENTBL
  259. CTB0:           PUSH    CX
  260.         PUSH    DX
  261.         MOV     AX,_SCREENBYTES ;AX = WIDTH OF TUBE
  262.         MOV     BX,DX           ;BX =
  263.         MOV     CL,1            ;
  264.         SHR     BX,CL           ; ... LINE NUMBER DIV 4
  265.         PUSH    DX
  266.         MUL     BX              ;MUL WIDTH OF SCREEN
  267.         MOV     DI,AX           ;DI IS NOW THE PARTIAL OFFSET
  268.         POP     DX
  269.  
  270.         SUB     DH,DH           ;
  271.         MOV     AX,2000H        ;MULTIPLY DX MOD 4 BY 2000H
  272.         AND     DX,1
  273.         MUL     DX
  274.         ADD     DI,AX           ;ADD TO THE OFFSET
  275.         POP     DX
  276.         POP     CX
  277.  
  278.         MOV     BX,DX           ;AND PUT IT ON THE TABLE
  279.         SHL     BX,1
  280.         MOV     [SI+BX],DI
  281.         INC     DX
  282.         LOOP    CTB0
  283.         SUB     AX,AX           ;EVERYTHING'S FINE
  284.         JMP     TABLE_OK
  285.  
  286. NOT_CGA:        CMP     WORD PTR [BP + _AOFF + 0],EGA
  287.         JNE     NOT_EGA
  288.  
  289.         ;IT'S AN EGA CARD
  290.         MOV     _SCREENSEG,0A000H
  291.         MOV     _SCREENBYTES,80
  292.         MOV     _SCREENWIDE,640
  293.         MOV     _SCREENDEEP,350
  294.  
  295.         MOV     CX,_SCREENDEEP
  296.         SUB     DX,DX
  297.         MOV     SI,OFFSET _SCREENTBL
  298.  
  299. ETB0:           PUSH    DX
  300.         MOV     AX,_SCREENBYTES
  301.         MUL     DX
  302.         MOV     [SI],AX
  303.         ADD     SI,2
  304.         POP     DX
  305.         INC     DX
  306.         LOOP    ETBO
  307.         SUB     AX,AX           ;EVERYTHING'S FINE
  308.         JMP     TABLE_OK
  309.  
  310. NOT_EGA:        CMP     WORD PTR [BP + _AOFF + 0],MCGA
  311.         JNE     NOT_MCGA
  312.  
  313.         ;IT'S AN MCGA CARD
  314.         MOV     _SCREENSEG,0A000H
  315.         MOV     _SCREENBYTES,80
  316.         MOV     _SCRENWIDE,640
  317.         MOV     _SCREENDEEP,480
  318.  
  319.         MOV     CX,_SCREENDEEP
  320.         SUB     DX,DX
  321.         MOV     SI,OFFSET _SCREENTBL
  322.  
  323. MTB0:           PUSH    DX
  324.         MOV     AX,_SCREENBYTES
  325.         MUL     DX
  326.         MOV     [SI],AX
  327.         ADD     SI,2
  328.         POP     DX
  329.         INC     DX
  330.         LOOP    MTB0
  331.         SUB     AX,AX           ;EVERYTHING'S FINE
  332.         JMP     TABLE_OK
  333.  
  334. NOT_MCGA:       CMP     WORD PTR [BP + _AOFF + 0],HERCMONO
  335.         JNE     NOT_HERCMONO
  336.  
  337.         ;IT'S A HERCULES CARD
  338.         MOV     _SCREENSEG,0B000H
  339.         MOV     _SCREENBYTES,90
  340.         MOV     _SCREENWIDE,720
  341.         MOV     _SCREENDEEP,348
  342.         
  343.         MOV     CX,_SCREENDEEP
  344.         SUB     DX,DX
  345.         MOV     SI,OFFSET _SCREENTBL
  346.  
  347. HTB0:           PUSH    CX
  348.         PUSH    DX
  349.         MOV     AX,_SCREENBYTES ;AX = WIDTH OF TUBE
  350.         MOV     BX,DX           ;BX =
  351.         MOV     CL,2            ;
  352.         SHR     BX,CL           ; ... LINE NUMBER DIV 4
  353.         PUSH    DX
  354.         MUL     BX              ;MUL WIDTH OF SCREEN
  355.         MOV     DI,AX           ;DI IS NOW THE PARTIAL OFFSET
  356.         POP     DX
  357.  
  358.         SUB     DH,DH           ;
  359.         MOV     AX,2000H        ;MULTIPLY DX MOD 4 BY 2000H
  360.         AND     DX,3
  361.         MUL     DX
  362.         ADD     DI,AX           ;ADD TO THE OFFSET
  363.         POP     DX
  364.         POP     CX
  365.  
  366.         MOV     SI,OFFSET _SCREENTBL
  367.         MOV     BX,DX
  368.         SHL     BX,1
  369.         MOV     [SI+BX],DI
  370.         INC     DX
  371.         LOOP    HTB0
  372.         SUB     AX,AX           ;EVERYTHING'S FINE
  373.         JMP     TABLE_OK
  374.  
  375. NOT_HERCMONO:   MOV     AX,-1
  376.  
  377. TABLE_OK:       POP     BP
  378.         RET
  379. _DoTable        ENDP
  380.  
  381. ;SWITCH TO GRAPHICS MODE
  382. ;               ARG1 = CARD TYPE
  383.         PUBLIC  _GraphicsMode
  384. _GraphicsMode   PROC    FAR
  385.         PUSH    BP
  386.         MOV     BP,SP
  387.  
  388.         DATASEG
  389.  
  390.         MOV     AX,[BP + _AOFF + 0]
  391.         MOV     GMODE,AX
  392.  
  393.         CMP     GMODE,CGA
  394.         JNE     NOT_CGA
  395.  
  396.         MOV     AX,0006H
  397.         INT     10H
  398.         JMP     GRAF_OK
  399.  
  400. NOT_GCGA:       CMP     GMODE,EGA
  401.         JNE     NOT_GEGA
  402.  
  403.         MOV     AX,0010H
  404.         INT     10H
  405.         JMP     GRAF_OK
  406.  
  407. NOT_GEGA:       CMP     GMODE,MCGA
  408.         JNE     NOT_GMCGA
  409.         MOV     AX,0011H
  410.         INT     10H
  411.         JMP     GRAF_OK
  412.  
  413. NOT_GMCGA:      MOV     DX,03BFH
  414.         MOV     AL,1
  415.         OUT     DX,AL
  416.  
  417.         MOV     AL,2
  418.         MOV     SI,OFFSET GTABLE
  419.         MOV     BX,0
  420.         MOV     CX,4000H
  421.         CALL    HERC_MODE
  422.  
  423. GRAF_OK:        POP     BP
  424.         RET
  425. _GraphicsMode   ENDP
  426.  
  427. ;SWITCH TO TEXT MODE
  428.         PUBLIC  _TextMode
  429. _TextMode       PROC    FAR
  430.         PUSH    BP
  431.         MOV     BP,SP
  432.  
  433.         DATASEG
  434.  
  435.         CMP     GMODE,HERCMONO
  436.         JE      TEXT_HERC
  437.  
  438.         MOV     AX,0003H
  439.         INT     10H
  440.         JMP     TEXT_OK
  441.  
  442. TEXT_HERC:      MOV     DX,03BFH
  443.         XOR     AL,AL
  444.         OUT     DX,AL
  445.  
  446.         MOV     AX,20H
  447.         MOV     SI,OFFSET TTABLE
  448.         MOV     BX,720H
  449.         MOV     CX,2000H
  450.         CALL    HERC_MODE
  451.  
  452. TEXT_OK:        POP     BP
  453.         RET
  454. _TextMode       ENDP
  455.  
  456. ;GRAPHICS CARD INITIALIZATION DATA
  457. TTABLE          DB      61H,50H,52H,0FH,19H,06H,19H,19H,02H,0DH,0BH,0CH
  458. GTABLE          DB      35H,2DH,2EH,07H,5BH,02H,57H,57H,02H,03H,00H,00H
  459. GMODE           DW      ?
  460. _DATA           ENDS
  461.  
  462. _BSS            SEGMENT WORD PUBLIC 'BSS'
  463.  
  464. _BSS            ENDS
  465.  
  466.         END
  467.  
  468.  
  469.  
  470.